home *** CD-ROM | disk | FTP | other *** search
/ Trusted Irix /B 4.0.4 / Trusted-Irix B-4.0.1.iso / dist / eoe1.idb / usr / include / sys / nami.h.z / nami.h
C/C++ Source or Header  |  1992-04-03  |  6KB  |  203 lines

  1. /*    Copyright (c) 1984 AT&T    */
  2. /*      All Rights Reserved      */
  3.  
  4. /*    THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T    */
  5. /*    The copyright notice above does not evidence any       */
  6. /*    actual or intended publication of such source code.    */
  7.  
  8. #ifndef __SYS_NAMI_H__
  9. #define __SYS_NAMI_H__
  10. /*
  11.  * Copyright 1989 Silicon Graphics, Inc.  All rights reserved.
  12.  */
  13. #ident    "$Revision: 3.7 $"
  14.  
  15. struct pathname {
  16.     char    pn_buf[MAXPATHLEN];    /* pathname buffer */
  17.     char    *pn_component;        /* current component pointer */
  18.     char    *pn_nextchar;        /* next char to process */
  19.     ushort    pn_complen;        /* current component length */
  20.     ushort    pn_maxsize;        /* total bytes ever used in buf */
  21. };
  22.  
  23. enum pnfollow { DONTFOLLOW=0, FOLLOWLINK=1 };
  24.  
  25. #ifdef _KERNEL
  26. /*
  27.  * Macros and globals for "." and ".." testing.
  28.  */
  29. #define    ISDOT(cp, len) \
  30.     ((len) == 1 && (cp)[0] == '.')
  31. #define    ISDOTDOT(cp, len) \
  32.     ((len) == 2 && (cp)[0] == '.' && (cp)[1] == '.')
  33.  
  34. extern char dot[], dotdot[];
  35.  
  36. /*
  37.  * Pathname macro operations.  A pathname is represented by a null-termintaed
  38.  * string which may be broken into null-terminated components.
  39.  */
  40. #define    pn_peekchar(pn)        (*(pn)->pn_nextchar)
  41. #define    pn_endofpath(pn)    (pn_peekchar(pn) == '\0')
  42.  
  43. #define    PN_SKIPSLASH(pn) { \
  44.     register char *cp = (pn)->pn_nextchar; \
  45.     while (*cp == '/') \
  46.         cp++; \
  47.     (pn)->pn_nextchar = cp; \
  48. }
  49.  
  50. /*
  51.  * Isolate the next component in pn by skipping over and terminating it.
  52.  * As with old AT&T and SGI pathname handling code, this algorithm permits
  53.  * such solecisms as "/bin/tar/" and "/etc/passwd/".
  54.  */
  55. #define    PN_GETCOMPONENT(pn, cp) { \
  56.     cp = (pn)->pn_nextchar; \
  57.     (pn)->pn_component = cp; \
  58.     while (*cp != '\0' && *cp != '/') \
  59.         cp++; \
  60.     (pn)->pn_complen = cp - (pn)->pn_component; \
  61.     while (*cp == '/') \
  62.         *cp++ = '\0'; \
  63.     (pn)->pn_nextchar = cp; \
  64.     cp = (pn)->pn_component; \
  65. }
  66.  
  67. /*
  68.  * Maximum number of symbolic link expansions per pathname, used to
  69.  * prevent infinite recursion.
  70.  */
  71. #define    MAXLINKDEPTH    8
  72.  
  73.  
  74. extern int        spath(), upath();
  75. extern int        pathname(char *, int (*)(), struct pathname *);
  76. extern int        pn_lookup(struct pathname *, struct argnamei *,
  77.                   enum pnfollow, struct inode **,
  78.                   struct inode **);
  79. extern struct inode    *namei(int (*)(), struct argnamei *, enum pnfollow);
  80. #endif
  81.  
  82. /*
  83.  * Structure used by system calls to pass parameters
  84.  * to the file system independent namei and attribute
  85.  * functions.
  86.  */
  87. struct argnamei {    /* namei's flag argument */
  88.     ushort    cmd;    /* command type (see below) */
  89.     short    rcode;    /* a scratch for return codes (see below) */
  90.     long    mode;    /* mode for creat and chmod */
  91.     ushort    ftype;    /* file type */
  92.     ushort    uid;    /* uid for chown */
  93.     ushort    gid;    /* gid for chown */
  94.     dev_t    idev;    /* dev for creat */
  95.  
  96.     caddr_t    name;    /* symbolic link or rename source filename */
  97.     ushort    namlen;    /* length of symbolic link contents at name */
  98.     ushort    namseg;    /* address space of name */
  99.  
  100.     struct inode *dp;    /* rename source file's directory */
  101.     struct inode *ip;    /* rename/link source inode, unlocked */
  102. };
  103.  
  104. /*
  105.  * Possible values for argnamei.cmd field 
  106.  */
  107. #define    NI_DEL        0x1    /* unlink this file */
  108. #define    NI_CREAT    0x2    /* create */
  109. #define    NI_XCREAT    0x3    /* Exclusive create, error if */
  110.                 /* the file exists */
  111. #define    NI_LINK        0x4    /* make a link */
  112. #define    NI_MKDIR    0x5    /* mkdir */
  113. #define    NI_RMDIR    0x6    /* rmdir */
  114. #define    NI_MKNOD    0x7    /* mknod */
  115.  
  116. #define    NI_SYMLINK    0x8    /* make a symbolic link */
  117. #define    NI_RENAME    0x9    /* rename a file */
  118.  
  119. /* pseudo-command used as argnamei pointer value */
  120. #define    NI_LOOKUP    0
  121.  
  122. /* Requests to fs_setattr */
  123. #define    NI_CHOWN    0x1    /* change owner */
  124. #define    NI_CHMOD    0x2    /* change mode (permissions and 
  125.                 /* ISUID, ISGID, ISVTX) */
  126.  
  127. /* Codes to fs_notify */
  128. #define    NI_OPEN        0x1    /* open - some fstyps may want */
  129.                 /* to know when a file is opened */
  130. #define    NI_CLOSE    0x2    /* close */
  131. #define    NI_CHDIR    0x3    /* let fstyp know that a cd */
  132.                 /* is happening (e.g., some fstyp */
  133.                 /* may need to know so that */
  134.                 /* directory cache can be */
  135.                 /* flushed - if it has one) */
  136.  
  137. /*
  138.  * Return Codes for argnamei.rcode
  139.  */
  140. #define    FSN_FOUND    0x1    /* The file was found by namei (it exists) */
  141. #define    FSN_NOTFOUND    0x2    /* The file was not found by namei  */
  142.                 /* (i.e., it does not exist */
  143.  
  144. /*
  145.  * Return Codes for file sytem dependent namei's
  146.  */
  147. #define    NI_PASS        0    /* Error free FS specific namei */
  148. #define    NI_FAIL        1    /* Error encountered in FS specific namei */
  149. #define    NI_DONE        3    /* The fs dependent operation is */
  150.                 /* complete. There is no need to do */
  151.                 /* any further pathnme processing. */
  152.                 /* This is equivalent to NI_PASS for */
  153.                 /* those commands that require some */
  154.                 /* action from the fs dependent code */
  155. #define NI_NULL     4    /* Tell fs independent to return NULL to */
  156.                 /* the calling procedure without doing /*
  157.                 /* an iput */
  158.  
  159. /*
  160.  * Data that is passed from the file system independent namei to the
  161.  * file system dependent namei.
  162.  */
  163. struct nx {
  164.     struct    inode *dp;    /* directory inode in, sometimes child out */
  165.     struct    inode *ip;    /* child inode for NI_LOOKUP pseudo-command */
  166.     caddr_t    comp;        /* pointer to beginning of current component */
  167.     ushort    len;        /* component length */
  168.     struct pathname *pn;    /* pointer to the pathname buffer */
  169.     enum pnfollow follow;    /* whether to follow a terminal symlink */
  170. };
  171.  
  172. /* Values for fsinfo[].fs_notify. If an fstyp wishes to be */
  173. /* notified of an action the appropriate flag should be set */
  174. /* in fsinfo[].fs_notify and fstypsw[].fs_notify should point */
  175. /* to the desired fs dependent function */
  176. #define    NO_CHDIR    0x1    /* chdir */
  177. #define    NO_CHROOT    0x2    /* chroot */
  178. #define    NO_SEEK        0x4    /* seek */
  179.  
  180. struct argnotify {
  181.     long     cmd;    /* command - see above */
  182.     long    data1;    /* Allow caller to pass two pieces of data. */
  183.     long     data2;    /* These should be caste appropriately in */
  184.             /* the fs_notify routine. They are declared */
  185.             /* as longs here. However, they should be */
  186.             /* large enough to hold the largest machine */
  187.             /* specific data types (e.g., if a pointer is */
  188.             /* larger than a long then these should be */
  189.             /* int *). */
  190. };
  191.  
  192. /*
  193.  * Metering structure for the directory lookup rotor used by the "com"
  194.  * filesystem.  See sys/user.h and fs/com/com_dir.c.
  195.  */
  196. struct scanmeter {
  197.     long    rotates;    /* # times scan was based on rotor */
  198.     long    rotsaves;    /* # times offset saved as rotor */
  199.     long    wraps;        /* # wraps around end of dir */
  200. };
  201.  
  202. #endif /* __SYS_NAMI_H__ */
  203.